//
// Created by zhangyue26 on 2020/7/27.
//
#include <stdio.h>
#include <cstdlib>

int iCount;
//TODO 链表相关操作
/** 动态创建函数
 * 1、void *malloc(unsigned int size);
 * 该函数的作用是在内存中动态的分配一块size内存大小的空间，
 * 该函数会返回一个指针，如果出现错误会返回Null
 * 2、void *calloc(unsigned n,unsigned size);
 * 该函数的功能是在内存中动态分配n个长度的size大小的连续内存空间数组,
 * calloc()函数会返回一个指针，分配出错是返回Null
 * 3、void free(void *ptr)
 * 该函数的功能是使用由指针ptr指向的内存区，使部分内存区能被其他变量使用.
 * ptr是最近一次调用calloc()函数或malloc()函数时返回的值，free()函数无返回值
 */

struct Student {
    char cName[20];
    int iNumber;
    struct Student *nextStudent;
};

/**
 * 链表创建函数
 */
struct Student *createLinkedList() {
    struct Student *pHead = NULL;//初始化链表头指针为空
    struct Student *pEnd, *pNew;//新节点指针与最后一个节点的指针
    iCount = 0;
    pEnd = pNew = (struct Student *) malloc(sizeof(struct Student));
    printf("请输入新节点姓名、学号：\n");
    scanf("%s", &pNew->cName);
    scanf("%d", &pNew->iNumber);
    while (pNew->iNumber != 0) {
        iCount++;
        if (iCount == 1) {
            pNew->nextStudent = pHead;//使得指向为空
            pEnd = pNew;    //跟踪新加入的节点
            pHead = pNew;   //头指针指向首节点
        } else {
            pNew->nextStudent = NULL;   // 新节点的指针为空
            pEnd->nextStudent = pNew;   //原来的为节点指向新节点
            pEnd = pNew;    //pEnd指向新节点
        }
        pNew = (struct Student *) malloc(sizeof(struct Student));//再次分配节点内存
        printf("请输入新节点姓名、学号：\n");
        scanf("%s", &pNew->cName);
        scanf("%d", &pNew->iNumber);
    }
    free(pNew);     //释放没有用到的空间
    return pHead;
}


